home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / 081-090 / amok85 / streams / streams2.mod < prev    next >
Text File  |  1993-11-04  |  6KB  |  229 lines

  1. (*------------------------------------------
  2.  
  3.   :Program.     Streams
  4.   :Author.      Dieter Bogdoll [db]
  5.   :Address.     SMail: Gudrunstr. 7, D-8000 München 19
  6.   :Address.     EMail: landon@amc.zer
  7.   :Address.     EMail: 2:246/221.3@fidonet
  8.   :Address.     EMail: bogdoll@informatik.tu-muenchen.de
  9.   :Version.     V1.0a
  10.   :Date.        20-Feb-1993
  11.   :Copyright.   Public Domain
  12.   :Language.    Oberon
  13.   :Translator.  Amiga Oberon 3.00d
  14.   :Support.     Objektorientierte Programmierung in Oberon-2
  15.   :Imports.     Format [db] : aehnlich Format wie in io.mod
  16.   :Contents.    abstrakte Datenmodel Streams
  17.   :Contents.    Zeichenstroeme fuer Zeichenein/ausgabe
  18.   :Contents.    sei es per Console oder Files
  19.   :Bugs.        nicht ausfuehrlich getestet
  20.   :History.     V0.0   [db] 15-Feb-1993 : Erstellt
  21.   :History.     V0.1   [db] 19-Feb-1993 : sollte fuer alle Oberon-Compiler
  22.   :History.                               geeignet sein
  23.   :History.     V0.2   [db] 19-Feb-1993 : speziell an den Amiga angepasst
  24.   :History.                               zb. Format, Printf
  25.   :History.     V1.0a  [db] 20-Feb-1993 : Gebrauchsfertig
  26.  
  27. --------------------------------------------*)
  28. MODULE Streams;
  29.  
  30. IMPORT e:=Exec, y:=SYSTEM, f:Format;
  31.  
  32. CONST
  33.   eof = 1CX;
  34.  
  35. TYPE
  36.   Stream* = POINTER TO StreamDesc;
  37.   StreamDesc* = RECORD END;
  38.  
  39.   PROCEDURE (s: Stream) Open* (name: ARRAY OF CHAR; new: BOOLEAN): BOOLEAN;
  40.     (* $CopyArrays- *)
  41.     BEGIN HALT(99)
  42.   END Open;
  43.  
  44.   PROCEDURE (s: Stream) Close* (): BOOLEAN;
  45.     BEGIN HALT(99)
  46.   END Close;
  47.  
  48.   PROCEDURE (s: Stream) Write* (ch: CHAR);
  49.     BEGIN HALT(99)
  50.   END Write;
  51.  
  52.   PROCEDURE (s: Stream) WriteLn*;
  53.     BEGIN
  54.       s.Write("\n");
  55.   END WriteLn;
  56.  
  57.   PROCEDURE (s: Stream) WriteString* (a: ARRAY OF CHAR);
  58.     (* $CopyArrays- *)
  59.     VAR i : INTEGER;
  60.     BEGIN
  61.       i:=0;
  62.       WHILE a[i]#0X DO s.Write(a[i]); INC(i); END
  63.   END WriteString;
  64.  
  65.   PROCEDURE (s: Stream) WriteLongInt* (value: LONGINT; width: INTEGER);
  66.     VAR helpstr : ARRAY 40 OF CHAR;
  67.     BEGIN
  68.       f.Format1(helpstr, "%%%ldld", width);
  69.       f.Format1(helpstr, helpstr, value);
  70.       s.WriteString(helpstr);
  71.   END WriteLongInt;
  72.  
  73.   PROCEDURE (s: Stream) WriteInt* (value, width: INTEGER);
  74.     BEGIN
  75.       s.WriteLongInt(value, width)
  76.   END WriteInt;
  77.  
  78.   PROCEDURE (s: Stream) WriteShortInt* (value: SHORTINT; width: INTEGER);
  79.     BEGIN
  80.       s.WriteLongInt(value, width)
  81.   END WriteShortInt;
  82.  
  83.   PROCEDURE (s: Stream) WriteHex* (value: LONGINT; width: INTEGER);
  84.     VAR helpstr : ARRAY 40 OF CHAR;
  85.     BEGIN
  86.       IF width>=0 THEN
  87.           f.Format1(helpstr, "%%0%ldlx", width);
  88.         ELSE
  89.           width := -width;
  90.           f.Format1(helpstr, "%%-%ldlx", width);
  91.       END;
  92.       f.Format1(helpstr, helpstr, value);
  93.       s.WriteString(helpstr);
  94.   END WriteHex;
  95.  
  96.   PROCEDURE (s: Stream) Printf0*(a: ARRAY OF CHAR);
  97.     (* $CopyArrays- *)
  98.     VAR helpstr : ARRAY 256 OF CHAR;
  99.     BEGIN
  100.       f.Format0(helpstr, a);
  101.       s.WriteString(helpstr)
  102.   END Printf0;
  103.  
  104.   PROCEDURE (s: Stream) Printf1*(a: ARRAY OF CHAR; data1: LONGINT);
  105.     (* $CopyArrays- *)
  106.     VAR helpstr : ARRAY 256 OF CHAR;
  107.     BEGIN
  108.       f.Format1(helpstr, a, data1);
  109.       s.WriteString(helpstr)
  110.   END Printf1;
  111.  
  112.   PROCEDURE (s: Stream) Printf2*(a: ARRAY OF CHAR; data1, data2: LONGINT);
  113.     (* $CopyArrays- *)
  114.     VAR helpstr : ARRAY 256 OF CHAR;
  115.     BEGIN
  116.       f.Format2(helpstr, a, data1, data2);
  117.       s.WriteString(helpstr)
  118.   END Printf2;
  119.  
  120.   PROCEDURE (s: Stream) Printf3*(a: ARRAY OF CHAR; data1, data2, data3: LONGINT);
  121.     (* $CopyArrays- *)
  122.     VAR helpstr : ARRAY 256 OF CHAR;
  123.     BEGIN
  124.       f.Format3(helpstr, a, data1, data2, data3);
  125.       s.WriteString(helpstr)
  126.   END Printf3;
  127.  
  128.   PROCEDURE (s: Stream) Printf4*(a: ARRAY OF CHAR;
  129.                                  data1, data2, data3, data4: LONGINT);
  130.     (* $CopyArrays- *)
  131.     VAR helpstr : ARRAY 256 OF CHAR;
  132.     BEGIN
  133.       f.Format4(helpstr, a, data1, data2, data3, data4);
  134.       s.WriteString(helpstr)
  135.   END Printf4;
  136.  
  137.   PROCEDURE (s: Stream) Read* (VAR ch: CHAR);
  138.     BEGIN HALT (99)
  139.   END Read;
  140.  
  141.   PROCEDURE (s: Stream) ReadString* (VAR a: ARRAY OF CHAR);
  142.     (* $CopyArrays- *)
  143.     VAR i : INTEGER;
  144.     BEGIN
  145.       i := 0;
  146.       REPEAT
  147.         s.Read(a[i]);
  148.         CASE a[i] OF
  149.           "\n",eof,0X:      a[i] := 0X; RETURN
  150.         ELSE
  151.         END;
  152.         INC(i);
  153.       UNTIL i=LEN(a);
  154.   END ReadString;
  155.  
  156.   PROCEDURE (s: Stream) ReadLongInt* (VAR value: LONGINT): BOOLEAN;
  157.   VAR
  158.     ch: CHAR;
  159.     d: LONGINT;
  160.     neg: BOOLEAN;
  161.     str: ARRAY 40 OF CHAR;
  162.     i: INTEGER;
  163.   BEGIN
  164.     value := 0; i := 0;
  165.     s.ReadString(str);
  166.     neg := FALSE;
  167.     IF str[0]="-" THEN neg := TRUE; i := 1 END;
  168.     LOOP
  169.       ch := str[i];
  170.       CASE ch OF
  171.       0X: IF neg THEN value := -value END; RETURN TRUE |
  172.       "0".."9":
  173.         d := ORD(ch)-ORD("0");
  174.         IF (MAX(LONGINT)-d) DIV 10 >= value THEN value := 10*value+d ELSE EXIT END |
  175.       ELSE EXIT END;
  176.       INC(i);
  177.     END;
  178.     RETURN FALSE;
  179.   END ReadLongInt;
  180.  
  181.   PROCEDURE (s: Stream) ReadInt*(VAR value: INTEGER): BOOLEAN;
  182.   VAR
  183.     l: LONGINT;
  184.   BEGIN
  185.     IF s.ReadLongInt(l) & (l>=MIN(INTEGER)) & (l<=MAX(INTEGER)) THEN
  186.       value := SHORT(l);
  187.       RETURN TRUE;
  188.     END;
  189.     RETURN FALSE;
  190.   END ReadInt;
  191.  
  192.  
  193.   PROCEDURE (s: Stream) ReadShortInt*(VAR value: SHORTINT): BOOLEAN;
  194.   VAR
  195.     l: LONGINT;
  196.   BEGIN
  197.     IF s.ReadLongInt(l) & (l>=MIN(SHORTINT)) & (l<=MAX(SHORTINT)) THEN
  198.       value := SHORT(SHORT(l));
  199.       RETURN TRUE;
  200.     END;
  201.     RETURN FALSE;
  202.   END ReadShortInt;
  203.  
  204.  
  205.   PROCEDURE (s: Stream) ReadHex*(VAR value: LONGINT): BOOLEAN;
  206.   VAR
  207.     ch: CHAR;
  208.     d: LONGINT;
  209.     str: ARRAY 40 OF CHAR;
  210.     i: INTEGER;
  211.   BEGIN
  212.     value := 0; i := 0;
  213.     s.ReadString(str);
  214.     LOOP
  215.       ch := CAP(str[i]);
  216.       CASE ch OF
  217.       0X:       RETURN TRUE |
  218.       "0".."9": DEC(ch,ORD("0")) |
  219.       "A".."F": DEC(ch,ORD("A")-10) |
  220.       ELSE EXIT END;
  221.       d := ORD(ch);
  222.       IF (MAX(LONGINT)-d) DIV 16 >= value THEN value := 16*value+d ELSE EXIT END;
  223.       INC(i);
  224.     END;
  225.     RETURN FALSE;
  226.   END ReadHex;
  227.  
  228. END Streams.
  229.